from numpy import *
from math import *

"""
Sistema de ecuacións en forma:

a00*x1 + a01*x2 + a02*x3 = a03
         a11*x2 + a12*x3 = a13
                  a22*x3 = a23
"""
a = array([[1, 1, -2], [0, -3, 8], [0, 0, -10]])
b = array([[9], [-14], [-5]])
A = hstack((a, b))

def print_matriz(matriz):
    output = ""
    for fila in matriz:
        for elemento in fila:
                output += f"{elemento:10.2f}"
        output += '\n'
    print(output)

# Resolución de una fila de cierta matriz
def solucion(fila, matriz):
    cacho = 0
    for i in matriz[fila][(fila+1):-1]:
        cacho += i
    sol = (matriz[fila][-1] - (cacho))/matriz[fila][fila]
    return sol

# Resolución de la matriz mediante resolver desde la última fila hasta la primera
# y luego multiplicando en las filas anteriores de la matriz la solución por los
# coeficientes que están al lado de la incógnita (que ahora era solución)
def resolver_matriz(matriz):
    soluciones = []
    size = len(matriz)
    for i in range(size-1, -1, -1):
        x_i = solucion(i, matriz)
        soluciones.append(x_i)
        for j in range(i):
            matriz[j][i] *= x_i
    return soluciones

print("Matriz Ampliada:")
print_matriz(A)

print(f"Solución: Sustitución Regresiva")
sols = resolver_matriz(A)[::-1]
for k in sols:
    print(f"x({sols.index(k) +1 }) = {k:.2f}")